#ifndef SQLEvalVisitorImpl_HEADER_H
#define SQLEvalVisitorImpl_HEADER_H

// import java.util.ArrayList;
// import java.util.HashMap;
// import java.util.std::list;
// import java.util.std::unordered_map;

// import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
// import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
// import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
// import com.alibaba.druid.sql.ast.expr.SQLHexExpr;
// import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
// import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
// import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
// import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
// import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
// import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
// import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
// import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
// import com.alibaba.druid.sql.visitor.functions.Function;
#include <list>
#include <string>
#include <map>
#include "../ast/Object.h"
#include "SQLEvalVisitor.h"
#include "SQLASTVisitorAdapter.h"

class SQLEvalVisitorImpl
    : virtual public SQLASTVisitorAdapter,
      virtual public SQLEvalVisitor
{

private:
  Object_list_ptr parameters;

  std::map<std::string, SQLFunction*> functions;

  int variantIndex;

  bool markVariantIndex;

public:
  SQLEvalVisitorImpl();
  ~SQLEvalVisitorImpl() {}

  SQLEvalVisitorImpl(Object_list_ptr parameters);

  Object_list_ptr getParameters();

  void setParameters(Object_list_ptr parameters);

  // BOOL_ptr visit(SQLCharExpr *x);

  int incrementAndGetVariantIndex();

  int getVariantIndex();

  // BOOL_ptr visit(SQLVariantRefExpr *x);

  // BOOL_ptr visit(SQLBinaryOpExpr *x);

  // BOOL_ptr visit(SQLIntegerExpr *x);

  // BOOL_ptr visit(SQLNumberExpr *x);

  // BOOL_ptr visit(SQLHexExpr *x);

  // BOOL_ptr visit(SQLCaseExpr *x);

  // BOOL_ptr visit(SQLInListExpr *x);

  // BOOL_ptr visit(SQLNullExpr *x);

  // BOOL_ptr visit(SQLMethodInvokeExpr *x);

  // BOOL_ptr visit(SQLQueryExpr *x);

  bool isMarkVariantIndex();

  void setMarkVariantIndex(bool markVariantIndex);

  SQLFunction* getFunction(std::string funcName);

  void registerFunction(std::string funcName, SQLFunction* function);

  // BOOL_ptr visit(SQLIdentifierExpr *x);

  void unregisterFunction(std::string funcName);
};
#endif
